﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FinanSoft.Entities;
using FinanSoft.Utilities;
using FinanSoft.DataLayer;
using System.Data.SqlClient;

namespace FinanSoft.SaleRouteReports
{
    class SaleRouteDataManager
    {
        #region Singleton

        private static SaleRouteDataManager _instance;

        private SaleRouteDataManager()
        {
        }         
        
        /// <summary>
        /// Método para implementar el patrón de Singleton
        /// </summary>
        /// <returns>Instancia única de la clase</returns>
        public static SaleRouteDataManager GetInstance()
        {
            if (_instance == null)
                _instance = new SaleRouteDataManager();
            return _instance;
        }

        #endregion

        #region Public Methods
        /// <summary>
        /// Obtiene el detalle de cada factura realizada por un cliente en un artículo determinado. Si alguno de los 2 está como
        /// Constnats.INVALID_ID no lo toma en cuenta. Es decir que se puede pedir el detalle de todas las facturas de un artículo
        /// o de un cliente. La lista de de detalles se brinda en orden POR FACTURA. Es decir que los detalles de una misma factura
        /// son contiguos.
        /// </summary>
        /// <returns>Datos en bruto para hacer reportes de venta de artículo por cliente</returns>
        public List<SaleReportRawData> GetSaleData(int auxId, int itemId)
        {
            List<SaleReportRawData> reportData = new List<SaleReportRawData>();
            try
            {
                AppConfigReader appConfig = AppConfigReader.GetInstance();
                string spName = Constants.SP_NAME_GET_SALE_REPORT_DATA;
                SqlParameter[] parameters = {
                        new SqlParameter(Constants.SP_PARAM_GET_SALE_REPORT_DATA_ITEM_ID, itemId),
                        new SqlParameter(Constants.SP_PARAM_GET_SALE_REPORT_DATA_AUX_ID, auxId)};
                SqlDataHelper dataHelper = new SqlDataHelper(appConfig.GetConnectionString(Constants.DB_CONN));
                SqlDataReader result = dataHelper.ExecuteStoredProcedure(spName, parameters);
                while (result.Read())
                {
                    int dataItemId = System.Convert.ToInt32(result[Constants.SP_COLUMN_GET_SALE_REPORT_DATA_ITEM_ID]);
                    int dataAuxId = System.Convert.ToInt32(result[Constants.SP_COLUMN_GET_SALE_REPORT_DATA_AUX_ID]);
                    int dataDocId = System.Convert.ToInt32(result[Constants.SP_COLUMN_GET_SALE_REPORT_DATA_DOC_ID]);
                    int dataCurrencyId = System.Convert.ToInt32(result[Constants.SP_COLUMN_GET_SALE_REPORT_DATA_CURRENCY_ID]);
                    DateTime dataSaleDate = System.Convert.ToDateTime(result[Constants.SP_COLUMN_GET_SALE_REPORT_DATA_DATE]);
                    double dataQuantity = System.Convert.ToDouble(result[Constants.SP_COLUMN_GET_SALE_REPORT_DATA_QUANTITY]);
                    double dataUnitCost = System.Convert.ToDouble(result[Constants.SP_COLUMN_GET_SALE_REPORT_DATA_UNIT_COST]);
                    reportData.Add(new SaleReportRawData(
                        dataAuxId, dataItemId, dataCurrencyId, dataDocId, dataSaleDate, dataQuantity, dataUnitCost));
                }
                dataHelper.CloseReader();
                return reportData;
            }
            catch (Exception ex)
            {
                return null;
            }
        }
        #endregion 
    }
}
